package com.t.bricks.bussiness.controller.customerloginlog;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;

import javax.annotation.PostConstruct;

import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.SqlSessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import com.t.bricks.bussiness.controller.common.BaseController;
import com.t.bricks.bussiness.db.entity.customerloginlog.CustomerLoginLog;
import com.t.bricks.bussiness.service.common.CommonService;
import com.t.bricks.model.Log;
import com.t.bricks.model.MsgEmity;
import com.t.bricks.utils.modules.web.FindByPageParam;
import com.t.bricks.utils.spring.CloudBridgeUtil;
import com.t.bricks.utils.spring.ModuleUtil;

/**
 * 顾客登录日志控制层
 * 继承BaseController可直接实现通用方法,三个泛型代表:业务类、实体类、查询类
 * 通用业务类CommonService已经包含常用功能,使用自定义CustomerLoginLogService(需实现)可覆盖通用方法或扩展业务功能
 * 通用查询类可以直接使用Map,否则使用自定义ConditionCustomerLoginLog(需实现)
 * @author HuangXinBian
 * @DateTime 2022年06月22日 15:25:27
 */
@RestController
@Api(value="顾客登录日志", tags={"顾客登录日志操作接口"})
@RequestMapping("/customer/login/log/")
public class CustomerLoginLogController extends BaseController<CommonService, CustomerLoginLog, Map<String, Object>> {
	
	@Value("${app.name:}")
	private String appName;
	
	@Value("${app.key:}")
	private String appKey;
	
	@Value("${cloud.basesystem.inside.key:}")
	private String basesystemInsideKey;
	
	@Autowired
    private SqlSessionFactory sqlSessionFactory;
	
	/**
	 * 控制操作,首位9不参与用6个数代表开关,0为不限制,1为限制
	 * 6个数的控制分别是:删除、修改、查询、导出、统计、步骤值可逆
	 * 其中前5个为'是否仅创建者可操作'后续为其它控制开关
	 */
	protected int enableTag = 9000000;

	/**
	 * 设置 检查待新增内容是否存在重复数据(多字段组合重复即重复)集合
	 * @return 返回的集合将覆盖父类的checkRepeatCombination成员,若返回null则不进行重复校验
	 */
	@Override
	protected List<String> setCheckRepeatCombination() {
		return null;//例:Arrays.asList("sName", "sCreator");
	}

	/**
	 * 设置 检查待新增内容是否存在重复数据(单独字段重复即重复)集合
	 * @return 返回的集合将覆盖父类的checkRepeatAlone成员,若返回null则不进行重复校验
	 */
	@Override
	protected Map<String, Integer> setCheckRepeatAlone() {
		return null;
	}

	/**
	 * 删除数据
	 * @param iVersion
	 * @param id 表编号
	 * @return MsgEmity
	 */
	@RequestMapping(method={RequestMethod.POST}, value="/del")
	@Override
	public MsgEmity del(Integer iVersion, Long id) {
		String userId = ModuleUtil.currentLoginUserId();
		if (null == userId || (!"00000000".equals(userId) && !"00000001".equals(userId))) {
			return MsgEmity.err(9901, "只有管理员可以操作");
		}
		
		return super.del(iVersion, id);//直接使用父类中定义的方法,否则使用customerLoginLogService.del(iVersion, iId);
	}

	/**
	 * 根据记录编号查询符合分页数据的某条记录
	 * @param id 表编号
	 * @return MsgEmity
	 */
	@ApiOperation(value="根据记录编号查询符合分页数据的某条记录", response=CustomerLoginLog.class)
	@RequestMapping(method={RequestMethod.POST}, value="/find/page/row")
	@Override
	public MsgEmity findByPageRow(Long id) {
		return super.findByPageRow(id);//直接使用父类中定义的方法,否则使用customerLoginLogService.findByPageRow(id);
	}

	/**
	 * 查询分页数据
	 * @param findByPageParam 分页查询条件组合类
	 * 结构参考: {"page": 分页请求信息对象, "orders": 排序信息对象集合, "sLikeStr": 全文检索, "condition": 查询条件对象}
	 * @return MsgEmity 返回查询结果
	 */
	@ApiOperation(value="查询分页数据", response=CustomerLoginLog.class)
	@RequestMapping(method={RequestMethod.POST}, value="/find/page")
	@Override
	public MsgEmity findByPage(@RequestBody FindByPageParam<Map<String, Object>> findByPageParam) {//findByPage(@RequestBody FindByPageParam<ConditionCustomerLoginLog> findByPageParam)
		return super.findByPage(findByPageParam);//直接使用父类中定义的方法,否则使用 customerLoginLogService.findByPage(findByPageParam.getPage(), findByPageParam.getOrders(), findByPageParam.getsLikeStr(), findByPageParam.getCondition());
	}

	//---------------------------- 自动生成代码结束 ----------------------------//
	
	/**
	 * 注册来宾账户服务
	 */
	@PostConstruct
	private void registerGuest() {
		Configuration configuration = sqlSessionFactory.getConfiguration();

        Properties variables = configuration.getVariables();
        String sOwner = new StringBuffer().append(variables.getProperty("BricksMall")).append("Customer").toString();
        
        
		Map<String, Object> parameters = new HashMap<String, Object>(3);
		parameters.put("sOwner", sOwner);
		parameters.put("serverName", new StringBuffer().append(appName).append("Server").toString());
		parameters.put("sInsideKey", appKey);
		parameters.put("url", "/customer/login/log/inside/add");
		
		Map<String, String> hearMap = new HashMap<String, String>(1);
		hearMap.put("sInsideKey", basesystemInsideKey);
		
		MsgEmity me = CloudBridgeUtil.post(
				"TBaseSystemServer",//访问基本系统服务程序
				"/guest/register",//注册'来宾账户登录信息'的接口相对路径
				parameters,
				MsgEmity.class,//bridgeDao.post访问的方法中返回的数据类型
				false,
				hearMap);
		
		if (null == me) {
			Log.error("调用bridgeDao服务失败");
			return;
		}
		
		if (!me.isSuccess()) {
			Log.error("注册来宾账户服务失败");
			return;
		}
		
		Log.debug("注册来宾账户服务成功");
	}

	/**
	 * 新增登录日志
	 * 注意:这个只能进行内部调用
	 * @param sNameOrNo 登录时使用的用户名或手机号
	 * @param sIp 登录的ip
	 * @param sDevice 登录设备
	 * @param sMACAddress MAC地址
	 * @return
	 */
	@ApiOperation(value="新增数据", response=CustomerLoginLog.class)
	@RequestMapping(method={RequestMethod.POST}, value="/inside/add")
	public MsgEmity addLog(String sNameOrNo, String sIp, String sDevice, String sMACAddress) {
		String userId = ModuleUtil.currentLoginUserId();
		if (null == userId || (!"00000000".equals(userId) && !"00000001".equals(userId))) {
			return MsgEmity.err(9901, "只有管理员可以操作");
		}
		
		return super.callMapping(sNameOrNo, sIp, sDevice, sMACAddress);
	}

}
